/*https://leetcode-cn.com/problems/add-two-numbers/*/
// 给你两个 非空 的链表，表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的，并且每个节点只能存储 一位 数字。

// 请你将两个数相加，并以相同形式返回一个表示和的链表。

// 你可以假设除了数字 0 之外，这两个数都不会以 0 开头。
// 输入：l1 = [ 2, 4, 3 ], l2 = [ 5, 6, 4 ]
// 输出：[7, 0, 8]
// 解释：342 + 465 = 807.

// 示例 2：

// 输入：l1 = [0],
// l2 = [0] 输出：[0]
// 输入：l1 = [ 9, 9, 9, 9, 9, 9, 9 ],
// l2 = [ 9, 9, 9, 9 ] 输出：[8, 9, 9, 9, 0, 0,
// 来源：力扣（LeetCode）
// 链接：https : //leetcode-cn.com/problems/add-two-numbers
// 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution
{
private:
    void pushBackNewNode(ListNode **lastptr, int newVal)
    {
        ListNode *newNode = new ListNode();
        newNode->val = newVal;
        (*lastptr)->next = newNode;
        *lastptr = newNode;
    }

public:
    ListNode *addTwoNumbers(ListNode *l1, ListNode *l2)
    {
        //创建要返回的链表
        ListNode *back = new ListNode();
        //两个指针分别指向l1 与 l2 进行遍历
        ListNode *p1 = l1, *p2 = l2, *pback = back;
        int addFlow = 0;
        int addResult = 0;
        while (p1 && p2)
        {
            addResult = addFlow + p1->val + p2->val;
            addFlow = addResult / 10;
            addResult %= 10;
            //将addResult新增一个节点到pback后面
            pushBackNewNode(&pback, addResult);
            p1 = p1->next;
            p2 = p2->next;
        }
        //判断p1 p2 addFlow 的状态
        //至少一个l1 或 l2 已经遍历完了
        ListNode *gptr = p1 ? p1 : p2;
        while (gptr)
        {
            addResult = addFlow + gptr->val;
            addFlow = addResult / 10;
            addResult %= 10;
            //将addResult新增一个节点到pback后面
            pushBackNewNode(&pback, addResult);
            gptr = gptr->next;
        }
        //检测addFLow是否还有预留,有预留则要做最高位
        if (addFlow > 0)
        {
            //将addResult新增一个节点到pback后面
            pushBackNewNode(&pback, addFlow);
        }
        return back->next;
    }
};